package main

import (
	"fmt"
	"log"
	"os"
	"sync"
	"time"

	"github.com/eclipse/paho.mqtt.golang"
	"gopkg.in/goyy/goyy.v0/util/uuids"
)

func main() {
	//客户端示例,部分代码和服务端代码一样
	swg := sync.WaitGroup{}
	swg.Add(1)
	for i := 0; i < 1; i++ {
		go func() {
			gswg := sync.WaitGroup{}
			gswg.Add(1)
			//日志输出
			//mqtt.DEBUG = log.New(os.Stdout, "debug：", 0)
			//mqtt.ERROR = log.New(os.Stdout, "error：", 0)
			//生成客户端ID,每一个客户端都有一个固定的ID,这里是每次启动都是随机生成
			clId := uuids.New()[0:23]
			clId = "aaaaaaaaaaaaaab"
			opts := mqtt.NewClientOptions().AddBroker("tcp://172.17.0.5:1883")
			opts.SetClientID(clId)
			opts.SetKeepAlive(2 * time.Second)
			opts.SetPingTimeout(1 * time.Second)
			//接收消息的回调函数
			opts.SetDefaultPublishHandler(func(client mqtt.Client, msg mqtt.Message) {
				fmt.Println("SUB ", "客户端ID:", clId, "标题:", msg.Topic(), "  MSG:", string(msg.Payload()))
			})
			opts.SetUsername("admin")
			opts.SetPassword("admin")
			//断开连接时是否清除当前会话,如果清除重新连接后将收不到历史消息,需要保持当前客户端ID不变
			opts.SetCleanSession(false)
			c := mqtt.NewClient(opts)
			if token := c.Connect(); token.Wait() && token.Error() != nil {
				panic(token.Error())
			}
			//qos 0x00 0x01 0x02
			//0x00 - 表示成功- 最大的 QoS 0
			//0x01 - 表示成功- 最大的 QoS 1
			//0x02 - 表示成功- 最大的 QoS 2
			//0x80 - 表示订阅失败。
			if token := c.Subscribe("go-mqtt-sample", 1, nil); token.Wait() && token.Error() != nil {
				log.Println(token.Error())
				os.Exit(1)
			}

			gswg.Wait()
			if token := c.Unsubscribe("go-mqtt-sample"); token.Wait() && token.Error() != nil {
				fmt.Println(token.Error())
				os.Exit(1)
			}
			c.Disconnect(250)
		}()
	}
	swg.Wait()
}
